// 购物车模块
import { findGoods, mergeCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '../../api/cart'
export default {
  namespaced: true,
  state: () => {
    return {
      // 购物车商品内容
      list: []
    }
  },
  getters: {
    // 有效商品列表 依赖list
    validList (state) {
      // 有效商品：库存stock大于0 商品有效标识为true   isEffective
      return state.list.filter(item => item.stock > 0 && item.isEffective)
    },
    // 有效商品总件数 拿到有效商品的getters
    validTotal (state, getters) {
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品的总金额
    validTotalCount (state, getters) {
      return getters.validList.reduce((p, c) => p + parseInt(c.count * 100 * c.nowPrice), 0) / 100
    },
    // 无效商品列表
    invalidList (state) {
      return state.list.filter(item => !(item.stock > 0 && item.isEffective))
    },
    // 选中的商品列表
    selectedList (state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品的件数
    selectedTotal (state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 选中商品的金额
    selectedTotalCount (state, getters) {
      return getters.selectedList.reduce((p, c) => p + parseInt(c.count * 100 * c.nowPrice), 0) / 100
    },
    // 是否全选
    isSelectedAll (state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.selectedList.length !== 0
    }
  },
  mutations: {
    insertCart (state, goods) {
      // 要的购车信息  ： id skuid name attrsText picture nowPrice selected stock(库存) count isEffective(有效标识)
      // 说明找到相同的id
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      // 找不到返回-1
      if (sameIndex >= 0) {
        // 找到  现在该商品的数量为 原有的加上 现在添加的数量总和
        goods.count = state.list[sameIndex].count + goods.count
        // 删除旧的商品信息
        state.list.splice(sameIndex, 1)
      }
      // 添加新的商品信息
      state.list.unshift(goods)
      // console.log(state.list)
    },
    // 修改购物车商品
    updateCart (state, goods) {
      // 价格 nowPrice  库存 stock 是否有效 isEffective
      // goods 商品的字段不固定 对象中有哪些字段就该哪些 字段合理才改
      // goods商品对象中必须有skuid
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      for (const key in goods) {
        // selected bealoon 类型  对空数据进行过滤
        if (goods[key] !== undefined && goods[key] !== null && goods[key] !== '') {
          // 修改里面的值
          updateGoods[key] = goods[key]
        }
      }
    },
    deleteCart (state, skuId) {
      // 删除购物车中的商品
      const goodsIndex = state.list.findIndex(goods => goods.skuId === skuId)
      state.list.splice(goodsIndex, 1)
    },
    // 设置购物车
    setCart (state, payload) {
      // payload为空清空  为值数组设置
      state.list = payload
    }
  },
  actions: {
    // 合并购物车
    async mergeCart ({ state, rootState, commit, getters }) {
      // 合并的参数  要发请求
      const cartList = state.list.map(item => {
        return {
          skuId: item.skuId,
          count: item.count,
          selected: item.selected
        }
      })
      // console.log(cartList)
      // 合并成功
      await mergeCart(cartList)
      // 清空本地购物车
      commit('setCart', [])
    },
    // 修改规格
    updateCartSku ({ state, rootState, commit, getters }, { oldSkuId, newSku }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (rootState.user.profile.token) {
          // 登录 同步的 需要返回异步的 封装一个promise
          // 1：找出旧的商品信息
          // 2：删除旧的商品数据
          // 3：根据新的skuId和原先商品数量·
          const oldGoods = state.list.find(goods => goods.skuId === oldSkuId)
          deleteCart([oldGoods.skuId]).then(() => {
            return insertCart({ skuId: newSku.skuId, count: oldGoods.count })
          }).then(() => {
            return findCartList()
          }).then((data) => {
            commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录 同步的 需要返回异步的 封装一个promise
          // 1：找出旧的商品信息
          // 2：删除旧的商品数据
          // 3：根据新的sku信息和旧的商品信息 合并成新的
          const oldGoods = state.list.find(item => item.skuId === oldSkuId)
          commit('deleteCart', oldSkuId)
          const { skuId, price: nowPrice, specsText: attrsText, inventory: stock } = newSku
          const newGoods = { ...oldGoods, skuId, nowPrice, attrsText, stock }
          commit('insertCart', newGoods)
          resolve()
        }
      })
    },
    // 批量删除
    batchDeleteCart ({ state, rootState, commit, getters }) {
      return new Promise((resolve, reject) => {
        // 登录
        if (rootState.user.profile.token) {
          const ids = getters.selectedList.map(goods => goods.skuId)
          console.log(ids)
          deleteCart(ids).then(() => {
            return findCartList()
          }).then(data => {
            commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录 同步的 需要返回异步的 封装一个promise
          // console.log(1)
          // 找出选中的商品列表 遍历调用删除
          getters.selectedList.forEach(goods => {
            commit('deleteCart', goods.skuId)
          })
          resolve()
        }
      })
    },
    // 全选与取消全选
    checkAll ({ state, rootState, commit, getters }, selected) {
      return new Promise((resolve, reject) => {
        // 登录
        if (rootState.user.profile.token) {
          // commit('insertCart', goods)
          const ids = getters.validList.map(goods => goods.skuId)
          checkAllCart({ selected, ids }).then(() => {
            return findCartList()
          }).then(data => {
            commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录 同步的 需要返回异步的 封装一个promise
          // console.log(1)
          getters.validList.forEach(goods => {
            commit('updateCart', { skuId: goods.skuId, selected: selected })
          })
          resolve()
        }
      })
    },
    insertCart ({ state, rootState, commit }, goods) {
      // 同步和异步
      return new Promise((resolve, reject) => {
        // 登录
        if (rootState.user.profile.token) {
          // commit('insertCart', goods)
          // 加入购物车成功后  获取最新的购物车数据
          insertCart({ skuId: goods.skuId, count: goods.count }).then(() => {
            return findCartList().then(date => {
              commit('setCart', date.result)
              resolve()
            })
          })
        } else {
          // 未登录 同步的 需要返回异步的 封装一个promise
          // console.log(1)
          commit('insertCart', goods)
          resolve()
        }
      })
    },
    // 获取购物车列表
    findCart ({ state, rootState, commit }, goods) {
      // 登陆和本地 同步和异步
      return new Promise((resolve, reject) => {
        if (rootState.user.profile.token) {
          findCartList().then(data => {
            // 把登陆后的购物车 设置到state的list中
            commit('setCart', data.result)
            resolve()
          })
        } else {
          // 未登录
          // 同时发送请求（有几件商品发送几个）等所有请求全部发送成功 一并修改本地数据
          // Promise.all(promise数组).then((dateList) => {}) 全部发送成功
          const promiseAll = state.list.map(goods => {
            return findGoods(goods.skuId)
          })
          // dataList成功的结果的集合数据循序和promiseAll一致  索引一致
          Promise.all(promiseAll).then((dateList) => {
            // console.log(dateList)
            // 更新购物车
            dateList.forEach((data, index) => {
              // data中有空数据
              commit('updateCart', { skuId: state.list[index].skuId, ...data.result })
            })
            // 返回成功
            resolve()
          })
        }
      })
    },
    // 删除商品
    deleteCart ({ state, rootState, commit }, skuId) {
      return new Promise((resolve, reject) => {
        if (rootState.user.profile.token) {
          deleteCart([skuId]).then(() => {
            return findCartList()
          }).then(data => {
            commit('setCart', data.result)
            resolve()
          })
        } else {
          commit('deleteCart', skuId)
          resolve()
        }
      })
    },
    updateCart ({ state, rootState, commit }, goods) {
      // goods 中：必须有skuId，其他想修改的属性 selected  count
      return new Promise((resolve, reject) => {
        if (rootState.user.profile.token) {
          // 登录 TODO
          updateCart(goods).then(() => {
            return findCartList()
          }).then((data) => {
            commit('setCart', data.result)
            resolve()
          })
        }
      })
    }
  }
}
